/*
1. promise 就是一个类 在执行这个类的时候 需要传递一个执行器进去 执行器会立即执行
2. promise 中的三个状态 分别为 成功 fulfilled 失败 rejected 等待 pending
   
   pending -> fulfilled
   pending -> rejected
   一旦状态确定就不可更改
3. resolve和reject函数是用来更改状态的
   resolve: fulfilled
   reject:  rejected
4. then方法内部做的事情就是判断状态 如果状态时成功 调用成功的回调函数，如果状态时失败，调用失败的回调函数
   then方法是被定义在原型对象中的.
5. then成功回调有一个参数 表示成功之后的值 then失败回调有一个参数，表示失败后的原因
*/
// promise.all接受的是一个数组，数组里面可以接受任何值，包括普通值，也可以是promise对象，返回的结果是按照数组的顺序来返回的(返回的是promise对象)
// promise.all里面的是如果有一个是失败的，最终的结果也就是失败的。如果都是成功的，最终的结果就是成功的。
// promise.resolve()方法的作用是将给定的值转化为promise对象，意思就是promise.resolve()方法的返回值就是promise对象，
// 再返回的这个promise对象时候会包裹给定的这个值
// 可以接受普通值也可以接受promise对象。内部会进行判断传入的参数是promise对象还是普通值。
// 如果给定的是promise对象，内部会原封不动的在作为这个方法的返回值，所以我们才能能在后面调用then方法。
// finally()方法的特点是无论是成功还是失败始终都会执行一次。还有一个特点就是finally方法后面可以用then()方法果
// catch()当我们用then方法的时候如果没有用失败回调，catch方法是可以捕捉到错误的。作用就是处理当前promise为失败的情况
let MyPromise = require("./myPromise.js")
let promise = new MyPromise ((resolve,reject)=>{
    // setTimeout(()=>{
        // resolve("成功1")
        // reject("失败")
    // },2000)
    // resolve("成功")
    reject("失败")
    // throw new Error('executor error')
})
function p1(){
    return new MyPromise(function(resolve,reject){
        setTimeout(()=>{
          resolve("p1")
        },5000)
        // reject("error")
    })
}
function p2(){
    return new MyPromise(function(resolve,reject){
        resolve("p2")
        // reject("p2 finally")
    })
}
p2().then(value=>{
    console.log(value)
},reason=>{
    console.log(reason,11)
}).catch(reason=>{
    console.log(reason,2)
})
// p2().finally(()=>{
//     console.log("finally")
//     return p1()
// }).then(value=>{
//     console.log(value)
// },reason=>{
//     console.log(reason)
// })
// MyPromise.all(['a','b',p1(),p2(),'c']).then((result)=>{
//     console.log(result)
// })
// MyPromise.resolve(p1()).then(value=>console.log(value))
// promise.then().then().then(value=>console.log(value),reason=>console.log(reason))

// promise.then((value)=>{
//     console.log(value,1);
//     // return "于可可"
//     throw new Error("then error")
// },reason=>{
//     console.log(reason)
//     return 1000
// }).then(value=>{
//     console.log(value,2)
// },reason=>{
//     console.log(reason.message)
// })
// p1.then(value=>{},reason=>{
//     console.log(reason.message)
// })
